package edu.paper.job.service.impl;

import java.io.Serializable;
import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.stereotype.Service;

import edu.paper.job.dao.ResumeDao;
import edu.paper.job.domain.Employee;
import edu.paper.job.domain.Resume;
import edu.paper.job.service.EmployeeService;
import edu.paper.job.service.ResumeService;

/**
 * 简历业务逻辑实现类
 * @author bowen
 *
 */
@Service
public class ResumeServiceImpl implements ResumeService{

	@Autowired
	private ResumeDao resumeDao;
	
	@Autowired
	private ApplicationContext applicationContext;
	
	@Autowired
	private EmployeeService employeeService;
	
	public List<Resume> find(Resume resume) {
		return resumeDao.find(resume); 
	}

	public Resume get(Serializable id) {
		return resumeDao.get(id);
	}

	public void insert(Resume resume) {
		resumeDao.insert(resume);
	}

	public void update(Resume resume) {
		resumeDao.update(resume);
		
	}

	public void deleteById(Serializable id) {
		resumeDao.deleteById(id);
	}

	public void delete(Serializable[] ids) {
		resumeDao.delete(ids);
	}

	public void deleteResume(Resume resume) {
		//将resume的isDeleted设置为true
		resume.setIsDeleted(true);
		resumeDao.update(resume);
		//判断是否可以真的删除简历
		/*
		 * 删除简历时要满足一些条件，求职者删除了简历，企业不再浏览应聘的简历。
		 */
		resume = resumeDao.get(resume.getId());
		if(resume.getIsDeleted()) {//求职者删除了简历
			
			//检查企业是否不再浏览招聘信息，即包含该简历的雇佣关系都被企业删除了
			Employee params = applicationContext.getBean(Employee.class);
			params.getResume().setId(resume.getId());
			params.setIsCompanyDeleted(false);
			List<Employee> employees = employeeService.find(params);
			if(employees.size() == 0) {
				//没有企业要浏览该简历
				resumeDao.deleteById(resume.getId());
			}
		}
	}

	public void publishResume(Resume resume) {
		//将未被删除的但发布的简历撤销
		Resume params = new Resume();
		params.setApplicantId(resume.getApplicantId());
		params.setIsDeleted(false);
		params.setIsPublic(true);
		if(this.find(params).size() > 0) {
			//查到未被删除的但发布的简历
			Resume publishedResume = this.find(params).get(0);
			publishedResume.setIsPublic(false);
			resumeDao.update(publishedResume);
		}
		//将新要发布的简历发布
		resume.setIsPublic(true);
		resumeDao.update(resume);
	}

	public void coverResume(Resume resume) {
		//将isPublic=false
		resume.setIsPublic(false);
		resumeDao.update(resume);
	}

	public List<Resume> listApplicantResumes(Resume resume) {
		resume.setIsDeleted(false);
		return resumeDao.find(resume);
	}

	public List<Resume> listPublishedResumes(Resume resume) {
		resume.setIsDeleted(false);
		resume.setIsPublic(true);
		return resumeDao.find(resume);
	}

	@Override
	public void updateResume(Resume resume) {
		if(resume.getIsPublic() != null && resume.getIsPublic()) {
			//发布简历只能通过publishResume方法
			//先更新其他普通字段，发布简历字段不更新
			resume.setIsPublic(false);
			resumeDao.update(resume);
			//更新完其他字段，再发布简历
			this.publishResume(resume);
		}else {
			resumeDao.update(resume);
		}
	}

	@Override
	public void insertResume(Resume resume) {
		//添加简历，肯定不是删除的
		resume.setIsDeleted(false);
		if(resume.getIsPublic() != null && resume.getIsPublic()) {
			//如果要发布，为了保证发布的简历只有一个，先把发布改为false保存之后再发布简历
			resume.setIsPublic(false);
			resumeDao.insert(resume);
			this.publishResume(resume);
		}else {
			//否则就直接保存
			resumeDao.insert(resume);
		}
	}

	@Override
	public List<Resume> query(Resume resume) {
		return resumeDao.query(resume);
	}

	@Override
	public List<Resume> queryResume(Resume resume) {
		//根据条件模糊查询求职者未删除发布的简历
		resume.setIsDeleted(false);
		resume.setIsPublic(true);
		return resumeDao.query(resume);
	}

}
